#include <my_header.h>

/* Usage: ./2_read filename */
int main(int argc, char *argv[]){                                  
    ARGS_CHECK(argc, 2);
    // 以读写形式打开文件
    int fd = open(argv[1], O_RDWR);
    ERROR_CHECK(fd, -1, "open");

    // read函数读取数据的单位是字节
    // 方便计算字节的数量，常用char数组作为数组buf中转站
    char buf[6] = { 0 };
    // 读取的字节数 buf 的最后一个位置保留一个字节用于字符串结束符 \0。
    // 防止buf操作出现未定义行为 越界访问内存 导致程序崩溃或产生意外
    ssize_t sret = read(fd, buf, sizeof(buf) -1 );
    ERROR_CHECK(sret, -1, "read");
    // 打印读到的实际字节数(sret)以及读到的字符信息(buf)
    printf("sret = %ld, buf = %s\n", sret, buf );

    // 将buf数组内存区域清零
    memset(buf, 0, sizeof(buf));
    sret = read(fd, buf, sizeof(buf) -1);
    ERROR_CHECK(sret, -1, "sret");
    printf("sret = %ld, buf = %s\n", sret, buf);

    // 将buf数组内存区域清零
    memset(buf, 0, sizeof(buf));
    sret = read(fd, buf, sizeof(buf) - 1);
    ERROR_CHECK(sret, -1, "sret");
    printf("sret = %ld, buf = %s\n", sret, buf);
    
    // 最终关闭文件之前 会读三次
    close(fd);
    return 0;
}

#if 0
#include <string.h>
void *memset(void *s, int c, size_t n);

其中的三个参数的含义是：

s：指向要设定特定值的内存块的指针。此参数是一个传入传出参数，传入后同时还会作为返回值。
c：是一个 int 类型的值，但 memset 实际上将该值转换为 unsigned char 类型，然后用这个字节值来填充指定的内存块。
n：指定要设定特定值的字节数，即要把内存块s的多少个字节的内存空间设置为值c。
返回值：

memset 函数返回指向填充的内存块的指针，即参数 s 的值。

在利用一个缓冲区数组读写文件的过程中，为了避免存在脏数据，可以选择使用"memset"函数来清零缓冲区数据，但这不是必须的。



#endif
